1. 网络层的几个重要概念
如果使用
面向连接的通信方式,使得电信网络能够向用户(实际上就是电话机)提供可靠的通信服务
- 计算机网络
模仿电信网络,使用面向连接通信方式 - 通信之前先建立
虚电路VC(Virtual Circuit)(即连接),以保证双方通信所需的一切网络资源 - 如果再使用
可靠传输的网络协议,可使所发送的分组无差错按照次序到达终点,不丢失,不重复。
1.1 虚电路服务
当两台计算机进行通信的时候,也应当要建立连接,但是在分组交换中是建立一条虚电路(Virtual Circuit)
以保留双方通信所需要的一切资源,然后双方沿着已经建立号的虚电路发送分组
这样的话分组的首部就不需要填写目的主机的地址,只需要填写这条虚电路的编号,然后分组就能够在这条事先建立好的虚电路上进行分组的传送了。
虚电路只是一条逻辑上的连接,分组都沿着这条逻辑连接按照存储转发方式来传送,并不是真正建立了一条物理连接
如果这种通信方式再使用可靠的网络传输协议,那么就可以使得发送的分组
无查错,按序到达终点,当然也不重复,不丢失。
1.2 数据报服务
互联网的设计思路:
网络层要设计得尽量简单,向其上层只提供简单灵活、无连接的、尽最大努力交付的数据报服务,这里的数据报(datagram)或者IP数据报就是我们经常使用的分组
由于传输网络不提供端到端的可靠传输服务,这就使得网络中的路由器比较简单。
- 网络在发送分组的时候不需要先建立连接
- 每一个分组
(即IP数据报)独立发送,与其前后的分组无关(不进行编号) - 网络层不提供服务质量的承诺。即所传送的分支可能出错、丢失、重复和时序
(不按序到达终点),也不保证分组传输的时限
由主机中的运输层负责可靠的通信
| 对比的方面 | 虚电路服务 | 数据报服务 |
|---|---|---|
| 思路 | 可靠的通信应当由网络来保证 | 可靠通信应当由用户主机来保证 |
| 连接的建立 | 必须有 | 不需要 |
| 终点地址 | 仅在连接建立的阶段来使用,每个分组使用短的虚电路号 | 每个分组都有终点的完整地址 |
| 分组的转发 | 属于同一条虚电路的分组均按照同一路由进行转发 | 每个分组独立选择路由进行转发 |
| 当结点出故障的时候 | 所有通过出故障的节点的虚电路均不能工作 | 出故障的节点可能会丢失分组,一些路由可能会发生变化 |
| 分组的顺序 | 总是按照发送顺序到达终点 | 到达终点时不一定按发送顺序 |
| 端到端的查错处理和流量控制 | 可以由网络负责,也可以由用户主机负责 | 由用户主机负责 |
1.3 物理层上的数据交换技术与虚电路服务技术
电路交换:
建立连接-通信-释放连接,它的传输单位是报文,整个报文的比特流连续的从源点到达终点,这个过程中始终占用这个连接。报文交换:
无需建立连接,它并不占用一整条连接,而是一段一段的。
当两台计算机进行通信的时候,应该先建立连接,在分组交换中建立一条虚电路(Virtual CirCuit),然后双方就沿着建立的虚电路发送分组。这样一来,分组的首部就不需要填充完整的目的主机地址,而只要填写这条虚电路的编号就可以了。
通过虚电路服务如果再使用可靠传输的网络协议,所发送的分组就可以无差错地按序到达终点,不存在丢失与重复的情况。两台主机之间进行分组的交换都必须在实现建立好的虚电路上。
数据报文中的虚电路号:当两台建立了虚电路的机器相互通信的时候,可以根据数据报文中的虚电路号,通过查找交换机的虚电路表从而得到它的输出线路,进而将数据传送到目的端
采用虚电路网络会使得网络核心部分变得复杂,需要所有经过这条电路的节点来进行共同的维护。如果虚拟电路断开,那么数据将会丢失,只能重新建立虚电路。
问题:电路交换和虚电路交换技术都存在一个核心,那就是建立一条连接通路,这两者有什么区别?
- 物理连接层面上:
CS(电路交换)是在通信的时候建立电路,在通信完毕的时候拆除电路,建立的线路是不固定的。而虚电路交换表示这只是一种逻辑上的连接,其传输的分组都沿着这条逻辑连接按照存储转发的方式传送,一般来说通信线路由交换机的虚电路表来维护。 - 传输单元上看:
CS(电路交换)的传输是传输报文数据,虚电路传输的是分组
问题:分组交换(数据报服务)和虚电路交换都是通过分组来传输数据的,它们有什么区别?
- 从
通信线路连接的角度上来看:虚电路需要在交换机中维护一张虚电路编号表,这张表就代表着在进行虚电路交换的时候需要建立一层虚拟连接,而数据报服务不需要建立连接即可 - 从
数据传输单元内容来看:虚电路上的数据单元的包头含有的是虚电路的编号,而数据报服务含有的是完整的终点地址。
1.4 网络层的两个层面
不同网络中的两个主机之间的通信,要通过若干个路由器转发分组来实现,分组通过查找路由器中的转发表,从指明的端口转发到下一个路由器,
其中转发表是由路由表导出的,而路由表又是由互联网中许多的路由器按照共同选定的路由选择协议,通过许多次的相互交换路由信息而产生的。
不同网络中的两个主机之间的通信,要经过若干个路由器转发分组来完成
在路由器之间传送的信息有以下2大类
- 转发源主机和目的主机之间所传送的数据,把源主机所发送的分组,
接力从一个路由器转发到下一个路由器,最后将分组转发到目的主机 - 路由信息
(为数据传送服务),是根据路由选择协议所使用的路由算法,彼此不断地交换路由信息分组,其目的是为了在路由器中创建路由表,并由此导出为转发分组而使用的转发表。这一类信息的传送是为了第一类数据的传送而服务的。
数据层面(分组转发)
- 路由器根据本路由器生成的
转发表,把收到的分组从查找到的对应接口转发出去,纳秒量级 - 独立工作
- 采用
硬件进行转发,快
控制层面(路由选择)
- 根据路由选择协议的路由算法计算路由,创建出本路由器的路由表,慢,一般是秒的量级
- 许多路由器协同动作
- 采用软件计算
软件定义网络SDN(Software Defined Network)
路由器:查找转发表,转发分组,在SDN中不负责生成路由表并导出转发表了
远程控制器(在物理上可以由不同地点的多个服务器组成):掌握和控制主机和整个网络的状态,能够为每个分组计算出最佳的路由,然后在路由器中生成器正确的转发表
2. 网际协议IP
网际协议IP是
TCP/IP体系里面最重要的两个主要协议之一网际协议
IP是用来使得互联起来的许多计算机网络能够进行通信的,因此TCP/IP体系中的网络层通常被称为网际层
与网际协议配套的3个协议
地址解析协议ARP(Address Resolution Protocol):其作用进行网络地址与MAC地址之间的转换,ARP协议在最下面的一层,IP经常需要使用这个协议
网际控制报文协议ICMP(Internet Control Message Protocol)
网际组管理协议IGMP(Internet Group Management Protocol)
ICMP和IGMP经常需要使用IP协议
2.1 虚拟互联网络
虚拟互联网络是为了实现网络互通、将异构的网络互相连接起来
其中一种方案就是使用中间设备进行互联,将网络互相连接起来要使用一些中间设备,根据层次可以有以下四种不同的中间设备
| 层 | 中间设备 |
|---|---|
| 运输层及以上 | 网关(GateWay),连接两个不兼容的系统需要在高层进行协议的转换 |
| 网络层 | 路由器(router) |
| 数据链路层 | 网桥或者桥接器(bridge),交换机(switch) |
| 物理层 | 转发器 |
当中间设备是网桥或者转发器的时候,这仅仅是把一个网络扩大了,仍然是一个网络,一般不称为网络互联
参与互联的计算机网络都使用相同的网际协议IP,因此可以把互联以后的计算机网络看作为一个虚拟互联网络,如图(b)所示,意思就是互联起来各种物理网络的异构性本来是客观存在的,但是利用协议IP就可以使得这些性能各异的网络在网络层上看起来好像是一个统一的网络,这种使用协议IP的虚拟互联网络就可以称为IP网
当IP网上的主机进行通信的时候,就好像在单个网络上进行通信一样,它们对于互联的网络的异构细节(如具体的编址方案,路由选择协议,等等)是透明的
当主机H1要把一个IP数据报发送给目的主机H2,它首先会先查找这个路由器的分组转发表,如果这个目的主机是在本网络中的,那么不需要经过任何路由器就可以直接交付。
否则的话就必须把IP数据报发送给某个路由器,交给下一个路由器之后,同样查找是否在本网络中,如果在本网络中则直接交付,否则就转发到下一个路由器,这个过程我们叫做间接交付。
最后只有当某个路由器知道自己和H2连接在同一个网络上的时候,这时候就可以直接将数据报直接交付到目的主机上。
路由器的协议栈只有下三层
跳(hop):分组传送途中的每次转发都称为一跳
2.2 IP地址及其表示方法
整个的互联网就是一个
单一的、抽象的网络,IP地址就是给连接到互联网上的每一台主机(路由器)的每一个接口。分配一个在全世界范围内是唯一的32位标识符。ICANN
点分十进制法:为了便于人门书写和记忆,通常将这32位的标识符表示为4段的十进制数字
给每个主机(或者路由器)的接口分配一个IP地址,其含义就是这个IP地址不但标志这个主机(或者路由器),还标志了此接口所连接的网络,因此32位的IP地址采用的是两极结构,由两个字段组成
- 网络号:用来标志主机或者路由器所连接到的网络,一个网络号在整个互联网范围内必须是唯一的
- 主机号:标志该主机(路由器)
一个主机号在所连接的网络也就是前面的网络号所指明的网络中必须是唯一的,而网络号在整个互联网的范围内又是唯一的,因此一个IP地址在整个互联网范围内都是唯一的
IP地址 ::={<网络号>,<主机号>}
::=表示
定义为一定要记住,IP地址指明了连接到某个网络上的一个主机或者路由器。
IP地址的前n位是主机所连接的网络号,而IP地址后面的32-n位就是主机号
2.3 IP地址的特点
(1)每一个IP地址都由网络前缀和主机号两部分组成,从这个意义上说,IP地址一种分登记的地址结构
IP地址管理机构在分配IP地址的时候只分配网络前缀,剩下的主机号则由获得该网络前缀的单位自行分配
路由器根据目的主机所连接的网络前缀也就是地址块来转发分组,可以使得转发表中的项目数量大大减少,从而减少转发表所占的空间缩短查找转发表的时间
(2)实际上的IP地址是标志一台主机或者路由器和一条链路的接口,当一台主机同时连接到两个网络上的时候,这个主机就必须同时具有两个响相应的IP地址,它的网络前缀必须是不同的,这种主机称作为多归属主机。
(3)一个网络或者子网是指具有相同网络前缀的主机的集合,用转发器或者交换机连接起来的若干个局域网依然是一个网络,因为他们具有相同的网络前缀,具有不同网络前缀的局域网必须使用路由器进行连接
(4)在IP地址中,所有分配到网络前缀的网络,都是平等的,处理这些IP地址的算法与机制都是一样的。
路由器总是具有两个或者两个以上的IP地址,也就是路由器的每个接口的IP地址的网络前缀都不同
当两个路由器直接相连的时候,在连线两端的接口处,可以分配也可以不分配IP,如果分配了IP地址,那么这一段连线的线路就构成了只包含一段线路的网络,只所以叫做网络,是因为它有IP地址,这个网络仅需要两个IP地址,使用了/31地址块,也就是形成了点对点链路,通常把这样的特殊网络叫做无编号网络或者匿名网络
2.4 IP地址和MAC地址的关系
- IP地址:虚拟地址、软件地址、逻辑地址,在网络层以及以上的各层使用的地址
- MAC地址:硬件址或者物理地址,固化在网卡(适配器)的ROM上,在数据链路层使用
- MAC帧在传送的时候使用的源地址和目的地址都是MAC地址,这两个MAC地址都写在MAC帧的首部
- 连接在通信链路上的设备根据MAC首部中的MAC地址决定收下或者丢弃,只有在剥去MAC帧的首部,提取出IP数据报的首部的时候,才能找到源IP和目的地址IP
从最终的结果这个角度上来讲,数据包的目标IP地址决定了数据包最终将会到达哪一台计算机,而目标MAC地址决定了该数据包下一跳将由哪个主机进行接收,不一定是终点。
从这张图可以简单总结一下,首先数据包包含了起点的IP地址和终点的IP地址,这是在数据链路层以上定义的。而在发送交换过程中,需要记录下一跳的硬件MAC地址,因此在每次运输到新的以太网的路由器的时候,都会经过拆解数据链路层封装的帧信息,也就是将帧中的目标MAC地址更新,直到到达目标硬件被接收。
其中路由器起到了比较重要的作用,也就是将源地址和目标地址进行了路由转换,从而找到合适的端口将其转发出去。可以简单归纳为:在不同的网段中转发数据包
如果只有MAC地址而没有IP地址会怎么样?
如果没有IP地址,那么交换机在转发数据的时候,需要记住所有设备的MAC地址,并记住这些MAC地址所对应的端口映射,姑且不谈当设备的MAC地址发生变化的时候(不是指MAC地址本身发生变化,而是说MAC地址所对应的设备链接的端口发生了变化),与之相关的所有交换机都要发生对应的更新,这将会是非常巨大的开销,至于IP地址所具有的好处,下面将会开始讲解。
子网掩码:叫做网络掩码,地址掩码,它是用来指明一个IP地址的哪些位标识的是主机所在的子网以及哪些位标识的是主机的位掩码,子网掩码只有一个作用,就是将某个IP地址区分为网络部分和主机部分。
子网掩码的计算过程是与运算,这样做的目的是为了屏蔽主机位上的值,从而确认网络部分
- 在IP层抽象的互联网上只能看到IP数据报,即使IP数据报需要经过间接交付,但是在它的首部
源地址和目的地址始终都是IP1和IP2,数据报中间经过的IP地址并不出现在IP数据报的首部中- 虽然IP数据报首部有源站的IP地址,但是路由器只根据目的站的IP地址进行转发
- 在局域网的链路层只能看到
MAC帧,MAC帧在不同网络上进行传递的时候,其源地址和目的地址要发生变化
如图所示,开始在H1到R1传送的时候,写的是
MAC1传送到MAC3,而到了R1中,我们发现IP数据报中的目的地址和源地址没有发生变化,但是这时候MAC的首部中的源地址变成了MAC4和MAC5这个工作机理是:路由器在收到MAC帧后,在
数据链路层上就要剥去原来的MAC帧的首部和尾部,提取IP数据报的信息,在转发IP数据报的时候,就要重新添加MAC帧的首部和尾部
- IP层抽象的互联网屏蔽了下层这些很复杂的细节,能够使用统一的、抽象的IP地址研究主机和主机或者路由器之间的通信。
2.5 ARP地址解析协议
实现IP通信时使用了两个地址
- IP地址(网络层地址)
- MAC地址(数据链路层地址)
ARP(Address Resolution Protocol):从IP地址解析出MAC地址
问题:在一个网络上可能经常会有新的主机加入进来或者撤走一些主机,更换网络适配器也会使得主机的MAC地址改变,主机的MAC地址实际上就是适配器ROM固化的MAC地址
ARP地址解析协议解决这个问题的方法是在主机的ARP高速缓存中存放一个从IP地址到MAC地址的映射表,并且动态更换维护(新增或者超时删除),每一台主机都设置有一个ARP cache也就是ARP高速缓存,里面存有本局域网上各个主机和路由器IP地址到MAC地址的映射表,如图所示
ARP协议工作的原理
当主机A要向本地局域网上的某台主机B发送IP数据报的时候,就先要在它的ARP高速缓存中查看有没有主机B的IP地址(找key),如果有的话,那么就可以在ARP cache中查找出其对应的MAC地址,再把这个MAC地址写入MAC帧,然后通过局域网把MAC发往对应的MAC地址
当查找不到B的地址的时候,这时候可能是B才入网,也有可能是适配器A刚加电,还没有对应的信息存入到cache中,在这种情况下,主机A就会自动运行ARP,按照以下步骤执行主机B的MAC地址
(1)ARP进程在本地局域网上发送一个ARP请求分组,这个分组是封装在以太网帧中的。
请求的内容是:”我的IP地址是209.0.0.5,MAC地址是xxx,想要知道IP地址为209.0.0.6的主机的MAC地址”
(2)在本地局域网上的所有主机运行的ARP进程都收到此ARP请求分组
(3)主机B的IP地址和ARP请求分组中要查询的IP地址是一样的,就收下这个ARP请求分组,并且向主机A发送ARP响应分组,同时要在这个ARP响应分组中写入自己的MAC地址,其余的主机由于检测到IP地址不相同,因此不理睬这个请求分组
(4)主机A收到主机B的ARP响应分组之后,就在它的ARP高速缓存中写入主机B的IP地址到MAC地址的映射
当主机A向B发送数据报的时候,很有可能不久以后主机B就要向A发送数据报,因此主机B也可能想要向A发送ARP请求分组,在这种情况下,主机A在发送其ARP请求分组的时候,就顺便把主机的IP地址到MAC地址的映射写入到ARP请求分组,当主机B收到A的ARP请求分组的时候,就把主机A的这一地址写入到主机B自己的ARP高速缓存中。减少了网络的通信量
在通信过程中,如果遇到需要查找对方的MAC地址的时候
- 请求分组是广播的
- 响应分组是单播的
关于生存时间
ARP对保存在高速缓存中的每一个映射地址项目都设置生存时间,凡是超过生存时间的项目就从高速缓存中删除掉,设置这种地址映射项目的生存时间是很有必要的。
主机A和主机B进行通信,A的ARP高速缓存中保存有B的MAC地址,但是此时B的适配器坏了或者在网络上离线,B立即更换了一块,因此这时候主机B的MAC地址就改变了。
A在其ARP的高速缓存中查找到关于B原先的MAC地址,并且用该MAC地址向B继续发送数据帧,但是原来的MAC地址已经失效了,因此A无法找到主机B,但是当生存时间过去之后,A的ARP高速缓存中已经删除了B原先的MAC地址,于是这时候A要重新广播发送ARP请求分组,找到了B
ARP用于解决同一个局域网上的主机或者路由器的
IP地址和MAC地址的映射问题,如果所要找的主机和源主机不在同一个局域网上,主机就无法解析出另一个局域网上的主机
这这种情况下,如图所示,主机A和主机B跨网络进行通信
主机A发送给主机B的IP数据报首先需要通过与主机A连接在同一个局域网上的路由器R1来转发,因此主机A必须知道关于路由器R1的IP地址,于是A使用ARP协议将路由器R1的IP解析为MAC地址,然后将IP数据报传送到路由器R1。
之后R1知道要将数据报从R1发送到B,于是运用ARP协议将B的IP解析为MAC地址,将IP数据报从R1传送到路由器B
从IP地址到MAC地址的解析是自动进行的,而用户对这种地址的转换过程是透明的,只要主机或者路由器和本网络上的另一个已知IP地址的主机或者路由器进行通信,协议ARP就能够自动地把这个IP地址解析为链路层所需要的MAC层地址,然后插入到MAC帧中。
使用ARP的四种典型情况
(1)发送方是主机(如H1),要把IP数据报发送到同一个网络上的另一台主机,这时候H1发送ARP请求分组,在网络N1上进行广播(发送ARP请求分组),找到目的主机H2的MAC地址
(2)发送方是主机(如H1),要把IP数据报发送到另一个网络上的一台主机(如H3),这时候H1发送ARP请求分组(在N1上进行广播),找到N1上的一个路由器R1的MAC地址,剩下的工作由路由器R1来完成,R1要做的事情是下面的(3)(4)
(3)发送方式路由器,要把数据报转发到与R1连接在同一个网络N2上的主机,这时候R1发送ARP请求分组,在N2上广播,找到目的主机H3的MAC地址
(4)发送方式路由器R1,要把IP数据报转发到网络N3上一个一台主机,H4和R1并不是连接在同一个网络上的,这时候R1发送ARP请求分组,找到R2的MAC地址,然后将数据报传送到R2上,剩下的工作交给R2
既然在网络链路上传送的帧最终是按照
MAC地址找到目的主机的,那么为什么还需要使用两种地址?只用一个MAC地址似乎可以免除使用ARP协议由于全世界存在各种各样的网络,它们使用不同的MAC地址,要使得这些网络能够互相通信就必须进行非常复杂的MAC地址转换工作,由用户和主机来完成这项工作是不可能的事情,对全世界的以太网的MAC地址进行寻址,是非常困难的事情,其根本原因还是MAC地址之间的转换是非常复杂的
然而IP编址将这个复杂的问题给解决了,连接到互联网上的主机只需要各自拥有一个IP地址,它们之间的通信就像连接在同一个网络上那样简单方便。
在虚拟的IP网络上使用IP地址进行通信是非常方便的
2.6 IP数据报的格式
IP数据包首部的格式能够说明IP协议都具有什么功能
IP数据包由首部和数据两部分组成,首部的前一部分是固定长度,共20个字节,是所有IP数据包必须有的,在首部的固定部分的后面是一些可选的字段,其长度是可变的。
而描述首部格式的宽度是32位,也就是4个字节
这个图该如何来看呢?首先要看懂这个图的单位,竖着下来的首部具有20个字节,是表示固定部分具有20个字节,横着过来的写着的是0~31位,也就是说在分成每层4个字节的情况下,在这一层中,每4个字节中,有多少位是用来表示这些数据的。
比如说第03个字节,其中第03个二进制位用来表示版本号。
值得注意的是,由于数据的封装,我们认为传输层下来的东西都在数据部分中
(1)版本
版本占4位,指IP协议的版本,IP协议目前有ipv4和ipv6,通信双方使用的IP协议必须一致,目前广泛使用的IP协议版本号为4
(2)首部的长度
首部长度占4位,可表示的最大十进制数为15,请注意,这个字段所表示的数的单位是32位二进制数(4个字节),因此,当IP的首部长度为1111的时候,也就是十进制的15的时候,首部的长度就达到了60个字节。
而固定部分是20个字节,因此首部长度字段的最小值就是5(也就是首部长度为0101),因为一个宽度为4个字节,固定长度是20个字节,因此最小值就是5
当IP分组的首部长度,不是4字节的整数倍的时候,也就是不是宽度的整数倍的时候,必须利用最后的填充字段加以填充,因此IP数据报的数据部分永远在4字节的整数倍的时候开始,这样在实现协议IP的时候比较方便
(3)区分服务
简单来说,区分服务就是一个优先级字段,它的作用是在出口队列中给这个数据包指定转发次序,优先级高的先转发出去,以便获得较高的带宽。但是这种服务是有要求的,它要求请求方和接收方都认可这种标记,否则的话这个字段就起不到作用。
它占8位,配置计算机给特定应用程序的数据包添加一个标志,然后再配置网络中的路由器优先转发这些带标志的数据包,在网络带宽比较紧张的情况下,也能确保这种应用的带宽有保障,这就是区分服务,为这种服务保证服务质量。
(4)总长度
总长度指的是首部和数据之和的长度,单位为字节,总长度字段为16位,因此最大长度就是2^16-1=65535个字节,总长度占的地位是第0个字节的第16-31个比特。
但是回顾之前数据链路层的内容的话,一个帧的数据部分不能超过1500个字节,而65536个字节是远远超过了的,因此需要进行分片
最大传送单元(Maximum Transfer Unit):一个数据帧中的
数据字段最大长度
数据报的长度首部加上数据部分,一定不能够超过下面数据链路层所规定的MTU的值,在这种情况下必须将过长的数据报进行分片处理
IP数据报越短,路由器转发的速度就越快,为此,协议IP规定了在互联网中所有的主机和路由器必须能够接收长度不超过576字节的数据报
假设上层交下来的数据长度有512个字节,加上最长的IP首部60个字节,加上4个字节的富余量,就得到
576个字节,当超过了576个字节的时候,需要了解对方主机是否能够接受所要发送的数据报长度,否则就要进行分片
在进行分片的时候,数据报首部中的总长度字段是指分片后的首部长度与该分片的数据长度的总和
(5)标识
占16位,IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就+1,并将这个值赋值给标识字段,但是这个标识并不是序号,因为IP提供的是无连接的服务,数据报就不存在按序接收的问题,当数据报由于长度超过网络的MTU必须分片的时候,这个标识字段就被复制到所有的数据报片的标识字段中。
在后面的组装过程中,能够根据相同的表示字段使得分片之后的各数据报片最后能够正确地重装为原来的数据报
(6)标志(flag)
分片标志占3位,但只有前两位有意义
MF(More Fragment):分片标志的最后一位(最低位)作用是用来标志是否是最后一个分片,如果是最后一个分片,则分片标志为0,否则为1DF(Dont Fragment)第二位的作用是用来标志是否允许分片,如果是1,那么就不允许分片,否则可以
(7)片偏移
片偏移指出:较长的分组在分片之后,某片在原分组中的相对位置,也就是说,相对于用户数据字段的起点,该片从何处开始,片偏移以8个字节为偏移单位,这也就是说除了后一个数据片之外,其他每个分片的长度一定都是8个字节的整数倍
如图所示,这个数据报的总长度是3820个字,其数据部分是3800个字节,现在需要分片为长度不超过1420字节的数据报片,因固定首部的长度是20个字节,因此每个数据报片的数据部分长度不能够超过1400个字节,因此这样划分,将原数据报划分为1400,1400,1000个字节,原始数据报首部被复制为各数据报片的首部,但是必须修改有关字段的值,如图所示
其中具有相同表示的数据报片在目的站就可以无误地重装为原来的数据报
现在如果假定数据报片2经过某个网络还需要进行再分片,也就是划分为数据报片2-1(携带数据800字节)和数据报片2-2(携带600数据字节),那么这两个数据报片的总长度、标识、MF、DF和片偏移分别是820,12345,1,0,175、620,12345,0,0,175+800/8=275
解读一下这个片偏移是怎么理解的
片偏移指的是相对于用户的数据字段的起点,这个片从哪开始
对于这个例子而言,数据片1的数据部分是第一个切片,因此其片偏移就是0
数据片2的数据部分是第二个切片,相对于原始的数据字段,是在第一个切片之后的,因此其片偏移就是
1400/8=175如果对数据片2进行切片,那么相对于原始的数据字段,2-1是在第一个切片之后的,因此其片偏移还是
1400/8=175然后2-2是在第二个切片的第一个子切片之后的,因此其片偏移还要计算上子切片之后的偏移量,也就是
1400/8+800/8=275然后第三个切片就是在第二个切片之后的,也就是
275+600/8=275+75=350
(8)生存时间
生存时间字段的常用的英文缩写是TTL(Time To Live),占8位,指示数据报在网络中可通过的路由器的最大值,防止无法交付的数据报无限制地在互联网中兜圈子,当TTL减少为0的时候就丢弃这个数据报,TTL的单位是跳数,数据报能在互联网中经过路由器的最大数目是225,如果设置为1就值能在本地局域网上传输。
这是因为路由器在传输数据之前就将这个字段的值减少1,如果判断为0那么就直接丢弃这个数据报。
(9)协议
占8位,指出此数据携带的数据使用的协议,以便目的主机的IP层将数据部分上交给哪个处理进程
(10)首部检验和
首部校验和,占16位,只校验数据包的首部,不校验数据部分。这是因为数据报每次经过一个路由器,路由器都要重新计算一次首部检验和一些字段,比如说生存时间等可能发生变化。
这里不采用CRC检验码而采用简单的计算方法,计算方法如下:
在发送方,先将数据报的首部划分为许多16位字的序列,并且把检验和字段置为0,通过反码计算把这些所有16位字相加之后,将得到的和的反码写入检验和字段。
接收方收到数据报之后,把首部所有的16位字再使用反码算术计算一次,将得到的值取反码,就得到接收方检验和的结果,如果首部没有发生任何变化,那么结果肯定就是0,于是就保留这个数据,否则的话就认为出错了。
关于首部校验和的例子
首先以16位为一个单位划分这个首部,也就是
0100 0101 0000 0000
0000 0000 0001 1100
0000 0000 0000 0001
0000 0000 0000 0000
0000 0100 0001 0001
0000 0000 0000 0000
0000 1010 0000 1100
0000 1110 0000 0101
0000 1100 0000 0110
0000 0111 0000 1001
| 列/行 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 | 0 | 0 | |||||||||||||
| 2 | 1 | |||||||||||||||
| 3 | 1 | 0 | 0 | |||||||||||||
| 4 | 1 | 1 | ||||||||||||||
| 5 | 1 | 0 | ||||||||||||||
| 6 | 0 | |||||||||||||||
| 7 | 0 | |||||||||||||||
| 8 | 0 | |||||||||||||||
| 9 | 1 | 0 | ||||||||||||||
| 10 | 1 | 1 | ||||||||||||||
| 11 | 1 | 0 | 1 | |||||||||||||
| 12 | 1 | 1 | ||||||||||||||
| 13 | 0 | |||||||||||||||
| 14 | 0 | |||||||||||||||
| 15 | 1 | |||||||||||||||
| 16 | 0 | (+1) | (+1) | (+1) | (+1) | (+1) | (+1) | |||||||||
| 结果 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 0 |
| 检验和 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 |
计算过程大致就是上面的过程,比较麻烦,建议用excel表格来做,这样不容易乱
(11)源地址
占32位,发送IP数据报的主机的IP地址
(12)目的地址
占32位,接收IP数据报的主机的IP地址
IP数据报首部的可变部分
就是一个选项字段,选项字段支持排错、测量以及安全,从1个字节到40个字节不等,这些选项一个个拼接起来,中间不需要分隔符,最后用全0的填充字段补充为4字节的整数倍
3. IP地址分类
分类的方式的概述
- A类(网络号8位)
- B类(网络号16位)
- C类(网络号24位)
ABC类地址都是单播地址,是最常用的
- D类:多播地址,一对多通信
3.1 A类地址
A类地址的网络号占1个字节,只有7个bit可以使用。因为这个网络号的第一个bit固定为了0,
- 网络号全部为0的IP地址有特殊的用途,它表示本网络
- 网络号为127也就是
0111 111保留作为本地软件换回测试本主机进程之间通信之用
如果主机发送一个目的地址为换回地址(例如127.0.0.1)的IP数据报,那么本主机之中的协议软件就处理这个数据报之中的数据,而不会数据报发送到网络上,因此A类地址可以指派的网络号就是2^7-2=126
A类地址的主机号占3个字节,但是全0和全1是不指派的
- 主机号全为0表示的是本主机所连接到
的单个网络地址,比如说某个主机被指派了一个A类地址为(5.6.7.8),如果要表示这个网络的网络地址,那么就是将主机号设置为0,也就是5.0.0.0 - 主机号全为1表示的是所有的,因为这个全为1的主机号字段表示的这个网络上的所有主机
因此A类地址可以指派的主机号就是2^24-2
3.2 B类地址
B类地址的网络号字段有2个字节,因为这2个字节的前两个bit被固定为10,因此可以被分配的网络数就是2^14,IP地址第一部分取值范围是128-191,因此不存在本地环回网络和本网络
而对于主机号其中全为0依然是作为网络的网络地址,全为1作为广播地址而不被指派,因此主机号可以使用的地址就是2^16-2个
B类地址的默认子网掩码是255.255.0.0
3.3 C类地址
C类地址的网络号由3个字节组成,其中前三个bit被指定为110
IP地址的第一部分取值是192-223
C类地址的默认子网掩码是255.255.255.0,主机ID由第四部分组成,每个C类网络可以容纳的最多的主机数就是256-1(全1)-0(全0) = 254
3.4 D类地址和E类地址
网络地址的最高位是1110的地址是D类地址,D类地址的第一部分的取值范围是224-239,用于多播组播的地址,组播地址是没有子网掩码的。
子网掩码的目的是为了区分主机号与网络号,如果是多播,那么就是广播到多个主机,子网掩码就失去了其作用。
网络地址的最高位是11110地址为E类地址,第一部分取值范围240-254,保留为今后使用
其实所谓的分类也就是将所有的IP地址进行拼接与分离。
3.5 保留的IP地址
网络ID全为0个主机号全为0的地址作为本网络上的本主机
而当网络ID为全0而主机号不为0的时候,这时候表示位于同一个网络上的主机号为X的主机
主机ID全为0的地址,特指某个网段,比如
192.168.10.0 255.255.255.0指的是192.168.10.0网段主机ID全部为1的地址,特指该网段上的所有主机,数据链路层发送的将会是
FF-FF-FF-FF-FF-FF127.0.0.1:是本地环回地址,指的是本机IP地址,一般用来测试和使用,回送地址
127.x.x.x:是本地回送地址Loopback Address,也就是主机IP堆栈内部的IP地址
3.6 公网地址和私网地址
公网地址:公有地址和管理由Inter NIC负责,各级ISP使用的公网地址都需要进行申请,这样就能保证地址块不冲突私网地址:创建IP寻址方案的人也创建了私网IP地址,这些地址可以被用于私有网络,在Internet没有这些IP地址,Internet上的路由器也没有到私有网络的路由表
3.7 网络地址转换技术NAT
私网地址访问Internet需要NAT或者PAT,原理图如下
简单来说,NAT就是提供一个转换技术,内网使用一个私有的网段地址,当要与互联网通信的时候,将私有的地址转换为公网地址,让公网地址去与外部通信。
来回顾一下私网与公网的交互过程,首先就是私网的计算机要与公网的计算机进行通信,那么必然就要发送分组,分组中会包装源地址和目的地址,假设我们包装私网的IP去访问公网,是没问题的,因为路由器的特性决定了我只关注你要去哪里,而不关注你从哪里来,因此尽管你这个私网地址是无法从公网到达的,我也能将数据报发送到公网的计算机去。
然后公网的计算机要响应数据给私网的计算机了,这时候路由器就会蒙圈,因为你之前用的是私网的IP,路由器转发表中并没有私网的IP啊,这时候响应的数据就会发不回去,就会出现ping失败的现象。
那么怎么办呢?提供一个可在路由转发表的公网IP,作为私网的数据出口,每一个要与公网通信的私网IP都通过此路由器,将私网IP修改为公网IP,然后依次转发,这样就能确保响应数据的时候,数据能够回来。
也许你会问,既然知道了数据是通过公网IP回来的,那么如果我私网IP有很多个同时发数据出去,然后同时接数据回来,这时候我怎么确认哪个包是哪个客户端的呢?这里看一下百度百科的定义。
NAT将自动修改IP报文的源IP地址和目的IP地址,Ip地址校验则在NAT处理过程中自动完成。有些应用程序将源IP地址嵌入到IP报文的数据部分中,所以还需要同时对报文的数据部分进行修改,以匹配IP头中已经修改过的源IP地址。否则,在报文数据部分嵌入IP地址的应用程序就不能正常工作。
①如右图1这个 client(终端) 的 gateway (网关)设定为 NAT 主机,所以当要连上 Internet 的时候,该封包就会被送到 NAT 主机,这个时候的封包 Header 之 source IP(源IP) 为 192.168.1.100 ;
图1 Nat工作流程2
②而透过这个 NAT 主机,它会将 client 的对外联机封包的 source IP ( 192.168.1.100 ) 伪装成 ppp0 ( 假设为拨接情况 )这个接口所具有的公共 IP ,因为是公共 IP 了,所以这个封包就可以连上 Internet 了,同时 NAT 主机并且会记忆这个联机的封包是由哪一个 ( 192.168.1.100 ) client 端传送来的;
③由 Internet 传送回来的封包,当然由 NAT主机来接收了,这个时候, NAT 主机会去查询原本记录的路由信息,并将目标 IP 由 ppp0 上面的公共 IP 改回原来的 192.168.1.100 ;
④最后则由 NAT 主机将该封包传送给原先发送封包的 Client [2] 。
可以看到NAT主机帮我们做了这个事情,也就是在数据报中记录了私网原IP,便于复原。
5. 分类域间路由选择CIDR
IP地址有类的概念,A类地址默认子网掩码255.0.0.0,B类地址的默认子网掩码是255.255.0.0,C类地址的默认子网掩码是255.255.255.0,等长子网划分和变长子网划分,打破了IP地址类的概念,子网掩码也打破了字节的限制,这种子网掩码被称为VLSM,可变长子网掩码
这种方式的也可以使得路由器上的路由表大大精简,被称为无分类域间路由选择CIDR(Classless Inter-Domain Routing),子网掩码中1的个数被称为CIDR值
CIDR:无分类域间路由选择。- 消除了传统的A类、B类和C类地址以及划分子网的概念,可以更加有效地分配
IPv4,但无法解决IP地址枯竭的问题
要点
- 网络前缀
- 地址块
- 地址掩码
5.1 网络前缀
CIDR将网络号改称为网络前缀来之指明网络,剩下的后面的部分依然是主机号,用来指明主机
2级结构,2个字段:网络前缀和主机号,IP地址::={<网络前缀>,<主机号>}
网络前缀的位数n是多少?
最大的区别:前缀的位数n不固定,可以在0~32之间选取任意值。
CIDR记法:斜线记法,二进制IP地址的前n位是网络前缀,例如128.14.35.7/20的前20位是网络前缀。
5.2 地址块
CIDR把网络前缀都相同的所有连接的IP组成一个CIDR的地址块- 一个
CIDR地址包括的IP地址数目,取决于网络前缀的位数
我们通常使用地址块中的最小地址和网络前缀的位数指明一个地址块,比如说是128.14.30.0/20
128.14.32.7是IP地址,但是没有指明网络前缀的长度,因此并不知道网络地址是多少128.14.32.7/20是IP地址,但是同时指明了网络前缀是20位,由此可以导出网络地址128.14.32.0/20是包含多个IP地址的地址块或者网络前缀,同时也是这个地址块中主机号全0的地址,有时候最后面的0可以省略。
那么在上面的例子中,我们地址块中导出的128.14.32.0是这个网络的网络地址吗?
在CIDR下,由于网络前缀的存在,那么我们就一定要指定网络前缀n,在这种情况下
128.14.32.0无法确定你哪几位是网络,因此如果要指定网络地址,那么就应该表达出完整的CIDR也就是
128.14.32.0/20,这才是网络地址,因为通过/20这样的限制可以知道其主机号肯定是全0的。一定要记住,仅从斜线左边的IP地址已经无法知道其网络地址了。
5.3 地址掩码(address mask)
CIDR使用斜线计数法可以让我们知道网络前缀的数值,但是计算机看不见斜线计数法,而是需要使用二进制来进行各种计算。
那么在进行计算的时候,必须使用32位的地址掩码,通过这个地址掩码做位运算,可以快速得到网络地址。也就是子网掩码,位数32位,目的让机器从IP地址迅速算出网络地址。
这其中的K代表2^10
子网:某个网络的一部分就可以称之为子网,一个网络对于整个互联网来说,就可以看做是一个子网
CIDR中的特殊地址块
- 前缀=32,也就是32位的IP都是前缀,没有主机号,用于主机路由
- 前缀=31,地址块只有两个IP地址,其主机号为0和1,用于点对点链路
- 前缀=0,IP地址全部是0,用于默认路由
5.4 构造超网
路由聚合:一个大的CIDR地址块中往往包含很多小的地址块,在路由表中就可以用较大的一个CIDR地址块来代替许多较小的地址块。
其本质是对网络地址的合并,合并若干个x类网络,其具体手段可以是将子网掩码向左位移n位,达到合并的效果。什么场景下需要子网的合并?
当有一个交换机A下有200台计算机,交换机B下有200台计算机,由于超出了其向上的最大一个数量限制是255,因此分配地址的时候需要两个网段,比如说是192.168.0.0和192.168.1.0,如果没有子网合并(超网)技术,那么就需要在路由器中建立路由表,记录下192.168.0.0和192.168.1.0这也就意味着:
这两个交换机下的设备是可以直接通过交换机的相互交换来进行通信的,可是现在需要多了一层路由器来进行转发。
可见,并不是任何连续的网段都能被合并,比如说我想合并1和2,那这时候由于有两位不一样,因此需要子网掩码向左移动两位才足够,但是这时候就把0和3都一起合并进来了,这时候可能就会合并了冲突的网段,可能导致有问题产生。
结论:判断连续的2个网段是否能够合并,只要第一个网络号能被2整除,就能够通过左移1位子网掩码合并
这句话有两个关键点,连续以及网络号有序
推广的,对于n个网段是否能够被合并,只要第一个网络号能被n整除,就能够通过左移(log2n)位子网合并
5.5 判断一个网段是子网还超网
通过左移子网掩码合并多个网段,右移子网掩码将一个网段划分为了多个子网。
如果要判断一个网段到底是子网还是超网,就要看该网段是A类网络还是B类网络,还是C类网络,默认A类子网掩码/8,B类子网掩码/16,C类子网掩码/24
如果该网段的子网掩码比默认子网掩码要长,那就是子网,如果该网段的子网掩码比默认掩码要短,那就是超网。
这个比较好理解,子网掩码左移的话就证明网络号缩短,主机号增长,主机号增多,网段下的主机数量增加,网段被合并,子网掩码右移的话网络号增长,主机号缩短,网段下的主机数量减少,网段被划分。
所谓默认子网掩码的话就是要看网络号,根据网络来判断其是哪一类地址
6. IP层转发分组的过程
6.1 基于终点的转发
分组在互联网上是逐跳转发的,分组在互联网上的传送和转发如果是基于分组首部中的目的地址的话,那么这种转发就称作为基于终点的转发
因此,当分组到达一个路由器的时候,路由器就根据分组中的终点目的地址查找转发表,然后就可以得知下一跳应该到达哪一个路由器了。
压缩转发表的大小
转发表不是按照目的地址来直接查出下一跳的路由器的。也就是说不是直接查找目标主机,而是查找目的网络(网络的前缀),在找到了目的网络之后,就把这个分组在这个网络上直接交付目的主机。
这种做法能够大大压缩转发表的大小,加速分组在路由器中的转发。
当路由器在收到一个待转发的分组之后,从转发表中得出下一跳路由器中的IP地址后,不是把这个地址填入分组的首部,而是把这个地址送交数据链路层的网络接口软件
网络接口软件负责将下一跳路由器的IP地址转换成MAC地址(使用ARP协议),并将此MAC地址放在数据链路层的帧首部,然后利用这个MAC地址传送到下一跳路由器的链路层,然后再取出MAC帧的数据部分交给网络层。
当发送一连串的分组的时候,上述的这种查找转发表,调用ARP解析出MAC地址、将MAC地址写入到MAC帧首部都是必须做的,而且都是基于机器软件自动完成的。
能不能在转发表中不使用IP地址而直接使用MAC地址呢?这样的话就不需要维护IP协议的细节而节省开销了?
不行,我们使用抽象的IP地址,本来就是为了隐藏各种底层网络的复杂性,而MAC地址本身是属于数据链路层的内容,这就意味着我们在设计网络层是如何工作的时候,就还需要考虑到底层的MAC地址兼容性(包括MAC地址的不同格式,MAC地址合法性,MAC地址存活周期,MAC解析),存储等基本问题,这将会带来更高的耦合性,甚至无法找到对方的机器等问题。
例子说明分组转发的过程
主机H1发出一个分组,其目的地址是128.1.2.132,现在源主机是H1,而目的主机是H2,追踪分组转发的过程
[1]目的主机是否在本网络上?
- 如果在本网络上,那么就直接交付
- 如果不在本网络上,那么就将这根分组发送到本网络上的路由器,以后的事情都交给路由器进行处理
[2]判断是否在本网络上
主机H1首先把要发送的分组中的目的地址和本网络N1的子网掩码按位进行AND运算,得出一个运算结果。
- 如果运算结果等于本网络
N1的前缀,那么就表明分组的目的主机连接在本网络上 - 否则的话就必须将分组发送到路由器
R1,由路由器完成后续的任务
由于采用了CIDR记法,转发表中给出的都是网络前缀,而没有明显给出其子网掩码,我们可以通过网络前缀的位数推出子网掩码
如图所示,计算出来的结构不等于H1的网络前缀,那么也就是说目的主机不是连接在本网络上的
[3]分组是如何匹配前缀的?
寻找前缀匹配:就是在查找转发表,从转发表中顺序比较前缀,如果相同则匹配成功,否则匹配失败
6.2最长匹配前缀原则
如图所示,R1收到一个目的地址为128.1.24.1的分组,请你给出分组的转发接口。
请注意,公司B包含了3个子网,但是这些网络前缀并没有出现在路由器R1的转发表中,这是因为公司采用了路由聚合,把三个子网的所有地址聚合为一个网络前缀128.1.24.0/22
我们把进入到路由器R1的分组的目的地址分别和路由器R1的转发表进行AND运算,计算过程如下
128.1.24.0/22
128.1.24.0/24
-------------
128.1.24.1
可见两个都是匹配的,可是哪一个结果才是正确的?
网络前缀128.1.24.0/22可以划分为4个更小的/24前缀
#将128.1.24.0/22划分为4个子网
10000000 00000001 000011/00 00000000#128.1.24.0
#划分为4个子网
#subnet1
10000000 00000001 00001100/ 00000000#128.1.24.0/24
#subnet2
10000000 00000001 00001101/ 00000000#128.1.25.0/25
#subnet3
10000000 00000001 00001110/ 00000000#128.1.25.0/26
#subnet4
10000000 00000001 00001111/ 00000000#128.1.25.0/27
A分配到subnet1,而B分配到subnet2-4
公司B将这3个前缀合并为一个更大的前缀128.1.24.0/22,作为路由表中的一个项目
请注意,这个前缀和原来的前缀在形式上是一样的,但是实际的区别是很大的
比如说左边的那个是包含了128.1.24.1的,但是128.1.24.0/22(公司B聚合后的前缀)是不包含这个地址的
注意,路由聚合是允许聚合这样的地址,尽管会产生歧义
因此在采用CIDR编址的时候,如果一个分组在转发表中可以找到多个匹配的前缀,那么就应该要选择前缀最长的一个作为匹配的前缀,这个原则叫做最长前匹配原则,网络前缀越长,其地址块就越小,因而路由就越具体,因而要把前缀最长的排在第一行,加速查表。
主机路由和默认路由
主机路由(host route):又叫做特定主机路由,对特定目的的主机的IP地址专门指明一个路由
其网络前缀就是a.b.c.d/32,这个是放在转发表的最前面的
默认路由(default route)
不管分组的最终目的在哪里,都是由这个指定的路由器R来进行处理,用一个特殊的前缀0.0.0.0/0来表示默认路由,这个前缀的掩码是32个0,用全为0的掩码和任何目的的地址进行按位AND运算,结果一定全部都是0,是一定匹配的,然后就按照转发表中的项目,把这个分组送交到下一跳路由器进行处理。
分组转发算法
(1)从收到分组的首部提取目的主机的IP地址D(也就是目的地址)
(2)如果查找有特定的主机路由(D),那么就按这条路由的下一跳来转发分组,否则就从转发表中查找下一行开始检查
(3)把这一行的子网掩码与目的地址D进行AND运算
- 运算结果与本行的前缀匹配,那么查找就结束了,按照下一跳所指出的进行处理
- 检查与自己相连的网络前缀和运算结果是否相同,如果相同则直接发送到对应的网络
- 否则的话就转发到对应的路由器的接口
- 否则转发表还有下一行,继续检查
(4)如果转发表中有一个默认路由,则按照指明的接口,把分组传送到指明的默认路由,否则报告转发分组出错。
7. 网际控制报文协议(ICMP)
为了更加有效地转发IP数据报和提高交付成功的机会,在网际层使用了网际控制报文协议(Internet Control Message Protocol)。ICMP允许主机或者路由器报告差错情况和提供有关异常情况的报告,ICMP不是高层的协议,ICMP报文作为IP层数据报的数据,加上数据报的首部,组成IP数据报发送出去。
7.1 ICMP报文的种类
ICMP报文有两种,也就是ICMP差错报告报文和ICMP询问报文
ICMP报文的前4个字节是统一的格式,一共有三个字段类型、代码、检验和。接着的4字节的内容和ICMP的类型有关,最后面是数据字段,其长度取决于ICMP的类型
- 代码字段用来进一步区分某种类型中的几种不同的情况
- 检验和字段用来检验整个
ICMP报文
IP数据报的首部的检验和并不检验IP数据报的内容,因此IP数据报中的首部检验和不能保证经过传输的
ICMP的报文不产生差错。
差错报告报文类型
(1)终点不可达
当路由器或者主机不能交付数据报的时候就向源点发送终点不可达的报文
(2)时间超过
- 当路由器收到生存时间为零的数据报的时候,除了要丢弃这个数据报之外,还要向源点发送数据超过的报文。
- 当终点在预先规定的时间内不能收到一个数据报的全部数据报片的时候,这时候应该要丢弃全部已经收到的数据报片,并向源点发送时间超过报文
(3)参数问题
当路由器或者目的主机收到的数据报的首部中有字段的值不正确的时候,这时候就应该要丢弃数据报,并向源点发送参数问题报文
(4)改变路由(重定向)
当找到了更好的路由的时候,路由器把改变路由报文发送给主机,让主机知道下次应该将数据报发送给另外的路由器
出于效率的考虑,这些主机不和连接在路由器定期交换路由信息,在主机刚开始工作的时候,一般都会在转发表中设置一个默认的路由器的IP地址。
不管数据报发送到哪个目的地址,都一律将这个数据报传送给这个默认路由器,而这个默认路由器知道每一个目的网络的最佳路由,通过和其他路由器交换路由信息,如果默认路由器发现主机发往某个目的地址的数据报的最佳路由应该是网络上的另一个默认路由器R,就把改变路由报文告诉主机,于是就在主机的转发表中添加一个项目:到某某地址应该经过路由器R
所有的ICMP差错报告报文中的数据字段都具有相同的格式
把收到的需要进行差错报告的IP数据报的首部和数据字段的前8个字节提取出来,作为ICMP报文的数据字段
然后在加上相应的ICMP差错报告报文的前8个字节,就构成 了ICMP差错报告报文
提取数据字段的前8个字节是为了获取运输层中的端口号
然后组成好了的ICMP报文作为IP数据报的数据字段进行分组发送
ICMP差错报告报文不发送的情况
- 对
ICMP差错报告报文,不再发送ICMP差错报告报文,就是说如果ICMP报文本身出错,那么不会追加ICMP - 对第一个分片的数据报片的所有后续数据报片,都不发送
ICMP差错报告报文 - 对具有多播地址的数据报,不发送ICMP差错报告报文
- 对具有特殊地址
(127.0.0.0或者0.0.0.0)的数据报,不发送差错报告报文
常见的ICMP询问报文有两种
(1)回送请求或者回送回答:ICMP回送请求报文是由主机或者路由器向一个特定的目的主机发出的询问,收到此报文的主机必须给源主机或者路由器发送ICMP 回送回答报文,这种询问报文可以用来测试目的站是否可达以及了解有关的状态
(2)时间戳请求或者时间戳回答:在ICMP时间戳请求报文发出之后,就能够收到对方响应的ICMP时间戳护回答报文,利用在报文中记录的时间戳,就可以计算出当前网络的往返时延
7.2 ICMP应用举例
PING(Packet InterNet Groper):分组间探测,使用了ICMP回送请求与回送回答报文,是直接使用网络层ICMP的一个例子,没有通过运输层的TCP/UDP
traceroute/tracert:可以用来追踪从源点到终点的路径
工作流程简述
从1开始逐渐增大TTL,不断让途径的路由器向源主机发送一个
ICMP时间超过差错报文,当到达主机的时候,这时候的TTL=1,由于不执行转发,因为目标地址已经到了,但是由于UDP报文无法交付,这时候:
- 不转发数据报
- TTL不减1
目的主机向源主机发送一个
ICMP终点不可达的差错报告报文
8.子网划分
8.1 等长子网划分
子网划分:就是借用现有网段的主机位做子网位,划分出多个子网。
等长子网划分:就是将一个网段等分成多个网段,也就是等分成多个子网
- 需要确定子网掩码的长度
- 需要确定子网中第一个可用IP地址和最后一个可用的IP地址
8.2 变长子网划分
简单来说就是根据设备的个数来划定网段,并且根据网段来确定子网掩码,最简单的办法是根据最大的设备数量来确定基础网段,然后再根据基础网段进行位运算,根据位运算后的结果来确定子网掩码。
如果一个子网地址块是原来网段的$$(\frac{1}{2})^n$$,子网掩码就在原网段的基础上后移n位,不等长子网,其子网掩码也不相同。
在上述的划分中,还有D和E网段还没有被使用,而且这两个网段所需要的IP地址数量为2,加上全0和全1的限制,那么就是需要4个IP地址。
观察到032还没有被用,因此接下来考虑如何使用`032`的地址
9. IPv6和IPv4的对比
拥有更大的地址空间:将地址从IPv4的32位增大到了128位扩展的地址层次结构:可以划分为更多的层次灵活的首部格式:定义了许多可选的扩展首部改进的选项:允许数据报包含有选项的控制信息,其选项放在有效载荷中允许协议继续扩充:更好地适应新应用支持资源的预分配:支持实时影响等要求保证一定的带宽和时延的应用IPV6首部改为8字节对其:首部长度必须是8字节的整数倍
10.互联网的路由选择协议简介
互联网的路由选择协议要解决的问题是转发表中的路由是怎样得出的。路由选择协议属于网络控制层面的内容。规定了互联网有关的路由器应该如何交换信息并且生成路由表,再由路由表导出转发表
10.1 有关路由选择算法的几个基本概念
理想的路由选择算法
路由选择协议的核心是就是路由算法,也就是说需要哪种算法来获得路由表中的各种项目
- 算法必须是正确的和完整的,正确指的是沿着各路由表所指引的路由,分组一定能够最终到达目的网络和目的主机
- 算法在计算上应该要简单
- 算法能够适应通信量和网络拓扑结构的变化,要有自适应性,当网络中的通信量发生变化的时候,算法能够自适应地改变路由以均衡各链路的负载,当某个节点或者某些节点、链路发生故障不能工作的时候,或者修理好了再投入运行的时候,算法也能够及时地改变路由,有时候称这种自适应性为
稳健性 - 算法应该具有稳定性
- 算法是公平的
- 算法是最佳的,相对于某一种特定要求下得到的要求比较合理
如果从路由算法能随着网络的通信量或者拓扑自适应地调整变化来划分,那么就可以分成静态路由选择策略和动态路由选择策略。静态路由选择叫做非自适应路由选择,不能及时适应网络状态的变化,由人工配置每一条路由。
动态选择路由叫做自适应路由选择,较好地适应网络状态的变化,实现起来比较复杂,开销也大,动态选择适用于比较复杂的大网络
分层次的路由选择协议
互联网采用的路由选择协议主要是自适应的(也就是动态的)、分布式路由选择协议
可以把整个互联网划分为许多个较小的自治系统(autonomous system),一般都记为AS,自治系统AS是在单一技术管理下的许多网络、IP地址以及路由器,这些路由器使用一种自治系统内部的路由选择协议和共同的度量。每一个AS对其他AS表现出来的是一个单一的和一致的路由选择策略,这样的话就可以把路由选择协议分成两大类
- 内部网关协议
IGP(Interior Gateway Protocol):在一个自治系统内部使用的路由选择协议,在互联网中的其他自治系统选用什么路由选择协议无关,如RIP和OSPF - 外部网关协议
EGP(External Gateway Protocol):如果源主机和目的主机处在不同的自治系统中,这两个自治系统可能使用不同的内部网关协议,那么在不同的自治系统AS之间的路由选择,就需要使用外部网关协议EGP,目前使用得比较多的是BGP-4
注意:这里所说的自治系统并不是一个单一的网络,而是使用了相同的技术架构的一组(一个或者一个以上)的网络组成的一个系统
自治系统之间的路由选择就叫做域间路由选择(interdomain routing)而在自治系统内部的路由选择就叫做域内路由选择(intradomain routing)
如图所示,每个自治系统内部可以决定本自治系统内部运行哪一个内部路由选择协议,而在每个自治系统可能有一个或者多个路由器如图中的R1和R2等需要运行除了本系统内部的路由选择协议以外的外部网关协议。
对于比较大的自治系统,还可以将所有的网络再进行一次划分。例如以链路速率作为标准进行划分
11.静态路由
11.1 路由-网络层实现的功能
网络层的功能就是给传输层协议提供简单灵活的、无连接的、尽最大努力交付的数据包服务
通俗地来说,网络中的路由器为每一个数据包单独选择转发路径,网络层不提供服务质量的承诺
也就是说路由器直接丢弃传输过程中出错的数据包,如果网络中代发的数据包太多,路由器处理不了也会直接丢弃,路由器也不判断数据包是否重复,也不确保数据包按照顺序发往目标地址
网络畅通的条件:数据包有去有回
11.2 静态路由
在初始时,路由器只知道直连的网络地址,但是如果间隔某个节点,也就是目标节点对于这个路由器不是直连的,这个路由器就不知道怎么走了,这时候就需要网络管路员告诉路由器,这个地址该怎么走。
添加静态路由的基本指令
ip route <目标网段> <子网掩码> <出去的地址>
#如果想要单独发送给某个地址id
ip route <目标ip> <255.255.255.255> <出去的地址>
点到点的链路的下一跳可以是路由器的出口
删除路由的基本指令
no ip route <目标网段> <子网掩码> <出去的地址>
11.3 路由汇总与默认路由
路由汇总指的是将一部分相同网络地址的路由网络汇总起来,这样的话边缘理由只需要转发数据包到一个汇总路由上就可以完成转发功能。
简而言之,就是路由器在转发数据的时候,会先检查子网掩码长的,后检查子网掩码短的,这样的话可以保证子网掩码长的ip地址被检查到,否则会因为子网掩码长的ip把子网掩码短的ip给覆盖了而永远检查不到子网掩码长的ip地址。
默认路由
添加默认路由
ip route 0.0.0.0 0.0.0.0 10.0.0.2
其中0.0.0.0这个地址涵盖了所有的网段,是最大的路由,这个路由称为默认路由
默认路由的使用场景
如何理解这个操作呢?我们以路由器B为例,路由器B是一个末端路由器,连接在网段为10.1.0.0/24的以太网的末端上,可以看到B如果要转发数据到其他网段,其必经之路是10.2.0.1/24,那么就存在一种甩锅的手段,也就是说如果我B路由表中查找不到了下一跳地址,那么我就会把这个查询交给我的必由之路,让它去查询有没有,一层层地发过去,直到找到为止。
对于C这种而言,它处于有多边连接的,这种默认路由的选择就是先指定其他路由地址,然后剩下任意一个的时候,把它作为默认路由即可。
12.内部网关协议RIP
路由信息协议RIP(Routing Information protocol)是一个距离矢量路由选择协议
它每隔30秒就送出自己完整的路由表到所有激活的端口
RIP协议选择最优的标准就是跳数,认为到达目标网络所经过的路由器最少的路径就是最佳路径
默认它允许的最大跳数为15跳,也就是说16跳及其以上的距离被认为就是不可达的
在小型网络中,RIP会运转良好,但是对于慢速WAN连接的大型网络或者安装有大量路由器的网络来说,它的效率就比较低。
12.1 RIP协议工作原理
看图说话
我们以网段
192.168.10.0为例进行一个流程的讲述。首先路由器4.0.0.1会收到来自网段192.168.10.0的信息,这时候E0路由器会先将网段192.168.10.0的距离记入路由表,由于是直连的,因此距离为0,然后到了一定的时间片之后,触发RIP协议,相邻路由器之间交换路由表,然后4.0.0.1将路由表交给了B,B路由器开始推算,由于要到达网段192.168.10.0(下称N)是要经过路由器A,而A到网段N是要距离0的,因此B记录下字段目标网络192.168.10.0 距离1 下一跳2.0.0.1,同样,路由表交换到C的时候也是相同的步骤,它推算的依据是B交换过来的路由表这是基本的工作流程,如果有交换过来的路由表,到达目标网络的距离比当前路由表中的距离要更小,这时候就会打擂替换掉原来的下一跳以及距离。
简单来说,RIP协议选择路由器的标准就是跳数,每隔30秒就更新路由信息,向整个网络中的路由器广播自己,从而达到信息更新的目的
- RIPv1:靠的是广播信息,不带子网掩码,不支持变长子网,支持等长子网
- RIPv2:使用的是多播通告,带子网掩码,支持变长子网
RIP协议的缺点
好消息传播得快,坏消息传播得慢,当网络出现故障的时候,要经过比较长的时间才能够将此信息
(坏消息)传送到所有的路由器。
出了故障之前,R1和R2中的路由表保持正常的通信路由,这时候R1知道它到网1的距离是1,R2知道它到网3的距离是1,然后出了故障之后,R1认为网1就不可达了,其具体的手段就是将路由表中的网1距离修改为16,但是这时候如果R2还没有收到R1的更新报文,声明网1不可达了,这时候就会出现一种极端情况
R2发送原来的路由表给R1,这时候R1就会认为,R2找到了一条更短的路径到网1,其实可以解释为它认为网1迁移到了R2那一边,然后就会更新自己的路由表,将R2发送过来的+1,然后R2拿到它的路由表,由于R2不是和网1直连的,它认为网1在R1那一边的,然后它也加1,然后一直传来传去,直到到达16,它终于知道–网1不可达。
12.3 RIP数据包的格式
RIP的首部占4个字节,其中的命令字段指出报文的意义,例如1表示的是请求理由信息,2表示请求理由信息的响应或者未被请求而发出的路由更新报文,首部后面的必为0是为了进行字节的对齐
RIPv2报文中的路由部分由若干个路由信息组成,每个路由信息需要用20个字节,地址族标识符字段用来标识所使用的地址协议。如果采用的是IP协议,就令这个字段的值为2。原来考虑RIP也可以用于其他非TCP/IP协议的情况。路由标记填入自治系统号ASN,这是考虑使得RIP有可能接收到本自治系统意外的路由选择信息,再后面指出某个网络地址,该网络的子网掩码、下一跳的路由器地址以及到此网络的距离。一个RIP报文最多可以包括25个路由,因此RIP报文的最大长度是4+20*25=504字节。、
13.内部网关协议OSPF
13.1 最短路径优先
将计算机拓扑图中的节点看作为图中的节点,然后各条链路之间为其指定权值 ,然后从任一点出发,计算从这一条到其他任意点的最小权值和,这就是最短路径优先算法。
13.2 OSPF术语
- Router-ID
网络中运行OSPF协议的路由器要有一个唯一的标识,这就是Router-ID,并且Router-ID在网络中绝对不可以有重复
- COST
(开销)
OSPF协议选择最佳的路径的标准是带宽,带宽越高计算出来的开销越低。到达目标网络的各个链路累计开销最低的,就是最佳路径
- LINK
就是路由器上的接口,指的是OSPF进程下的接口
- LINK-STATE
链路状态(LSA)就是OSPF接口上的描述信息,例如接口上的IP地址,子网掩码,网络类型,Cost值等等,OSPF路由器之间交换的并不是路由表,而是链路状态LSA。OSPF通过获得网络中所有的链路状态信息信息,从而计算出每个目标精确的网络路径。OSPF路由器会将自己所有的链路状态毫不保留的发给邻居,并且在传递的过程中不会有任何的修改,通过这样的过程,最终,网络中所有的OSPF路由器都拥有网络中所有的链路状态,并且所有的路由器的链路状态应该能描述出相同的网络拓扑
- Neighbor
OSPF只有邻居才会交换LSA
看图说话
首先是初始状态下,路由器并没有互相发现对方,这时候为了发现对方,会发现
hello数据包,收到的hello数据包的路由器会依照发送者的地址回送给地方,这时候互相就确定了邻居关系。确定了邻居关系之后,就需要开始交换
LSA,它首先会给对方发送它自己的LSA数据库描述表,然后对方响应自己的LSA数据库描述表,接收发送确认信息,注意这个确认和第三个阶段的ACK是不一样的。这个阶段称为交换状态,交换状态的目的是为了维护LSA数据库的一致性,也就是说维护整个网络拓扑结构的唯一性。接着进入加载状态,这时候路由器经过加载状态会发生自己缺少的LSA信息,然后向邻居节点发送获取LSA请求信息,从而补齐自己的LSA数据库,如果邻居没有,邻居就会向邻居的邻居请求信息。从而达到一种洪泛的效果。收到信息后会返回一个
ACK,确认收到了最终完成了LSA的一致性统计,运行算法。
总结一下,OSPF有五种报文
- 类型1:问候
hello数据包,它是用来发现并建立邻居关系的 - 类型2:数据库
Database Description描述数据包,向邻居给出总计的链路状态数据库中的所有链路状态项目的摘要信息 - 类型3:链路状态请求
LSR(LinkStateRequest)数据包,向对方请求某些链路状态项目的完整信息 - 类型4:链路状态更新
LSU(LinkStateUpdate)数据包,用洪泛法对全网更新链路状态,这种数据包是最复杂的,也是OSPF最核心的部分,路由器使用这种数据包将其链路状态通知给相邻路由器,在OSPF中,只有LSU需要需要显示确认 - 类型5:链路状态确认
(LinkStateAcknowledgement):数据包,对LSU做确认。
13.3 OSPF支持多AS
OSPF将自治系统划分为两种不同的区域。
其中每个区域会有一个发言人,被称为区域边界路由器ABR(area border router)
在主干区域中的所有路由器被称为主干路由器(backbone router)
在自治系统边界也有一个发言人,这个发言人对外界自治系统进行发言,连接到外部自治系统,被称为自治系统边界路由器ASBR(AS border router)
14. 外部网关协议BGP
14.1 BGP简介
BGP是不同自治系统的路由器之间交换路由信息的协议
- 用于自治系统
AS之间的路由选择 - 只能是力求选择出一条能够到达目的网络而且比较好的路由
(不能兜圈子),而并非要计算出一条最佳路由 - 底层是路径向量路由选择协议
BGP的发言人BGP SPEAKER,也就是在上面所说的自治系统边界路由器,它的存在是为了在边界路由器之间交换信息。
14.2 eBGP和iBGP连接
在AS之间,BGP发言者在半永久TCP连接,其端口号是179,在此TCP连接上交换BGP报文以建立BGP会话,利用BGP会话交换路由信息
- 增加新的路由
- 撤销过时的路由
- 报告出错的情况
使用TCP连接交换路由信息的两个BGP发言人,彼此称为对方的邻站或者对等站
BGP发言人要交换网络可达性信息,要到达某个网络所需要经过的一系列自治系统。
- eBGP:运行eBGP协议,在不同的AS之间交换路由信息
- iBGP:运行iBGP协议,在AS内部交换BGP路由信息,通常也就是在网络内部通知各个路由器要发送到外部自治系统该怎么走。
同一个协议BGP所使用的报文类型、使用属性、使用的状态机(也就是工作流程)都是完全一致的。但是在通报前缀时使用的规则不同:
在eBGP连接的对等端得知的前缀信息,可以通报给一个iBGP连接的对等端,反过来也是可以的
但从iBGP连接的对等端得知的前缀信息,不能够通报给另一个iBGP连接的对等端
14.3 报文
- Open报文:用来与相邻的发言人建立关系,使得通信初始化
- Update报文:用来通告某一路由的信息,以及列出要撤销的多条路由
- KEEPLIBBE报文:用来周期性地证实邻站的连通性
- NOTIUFICATION通知报文:用来发送检测到的差错。
14.4 BGP路由信息
看图说话
这个图中为我们绘制了两条路由路径,这两条路由路径分别有两个关键发言人,分别是IP3a和IP3c, 我们以这两个关键发言人进行分组
对于IP3a,如果要经过IP3a找到X路由器,那么路由信息描述为
[前缀,AS-PATH,NEXT-HOP]其中:
- 前缀:指明要到哪一个子网
- BGP属性:最重要的两个属性,自治系统路径
AS-PATH,下一跳NEXT-HOP那么我要到
X这个子网,然后我(AS1)要经过的自治系统的路径是AS2,AS3,我下一跳要发给IP2a。因此表述为[X,AS2,AS3,IP2a]对于
IP3c,那么就是要到
X这个子网,我要经过的自治系统是AS3,我下一跳要发给IP3c,因此描述为[X,AS3,IP3c]要特别注意的是,这个下一跳是针对于整个自治系统而言的,因此总是边界发言人的端口
(下一个自治系统的端口)
14.5 路由选择算法
- 本地偏好值最高的路由
- AS跳数最小的路由
- 热土豆路由选择算法
- BGPID数值最小的路由。具有多个接口的路由器有多个IP地址,BGPID就使用该路由器的IP地址中数值最大的一个
15. 路由器及其构成
15.1 构成
路由器工作在网络层,用于设备的互联,是互联网中的关键设备,路由器的主要工作,进行转发分组,把从某个输入端口收到的分组,按照分组要去的目的地(也就是目的网络),把该分组从路由器的某个合适的输出端口转发给下一跳路由器
路由器整体来说可以分为两部分,一部分可以分为分组转发部分,一部分可以分为路由选择部分
- 软件层面
软件层面由路由选择协议、路由表组成,这些属于软件逻辑上的组件,它决定了路由器收到一个分组之后,通过哪些端口进行分组分发与传输。
- 硬件层面
它决定了路由器收到分组之后,如何处理这些分组,将这些分组存储在何种机构当中,并且解释了为什么会有丢包现象的产生(这是因为分组被收到之后,如果存储设备无法存储下所有的分组之后,对于后续来的分组就会将其丢弃。)
路由器进行分组转发的整个流程
从线路中接收分组,从输入端口接收比特(物理层工作),然后对于数据链路上包装而来的数据进行首部和尾部的剥除。
然后就开始网络层的解析,若收到的分组是交换路由信息的分组,送交路由选择处理机
如果收到的是数据分组,按目的查找转发表,根据得出的结果,经过交换结构到达合适的输出端口,若某分组正在查找转发表,则该分组排队等待。
接着就是分发到其他路由器/网络了,输出的端口会从交换结构中接收分组数据,当交换结构传输数据的速度过快而输出端口的输出速度跟不上的时候,这时候就会启用缓存队列,依次地将各个分组通过输出端口输出到外部,当分组处理的速率赶不上分组进入队列的速率的时候,队列满的时候,就会丢弃后面进入的分组
15.2 交换结构
交换结构一般有三种存在形式
- 通过存储器进行交换,类似于缓冲队列
- 通过互联网络进行交换,类似于交换机设备
- 通过总线型设备进行交换,类似于集线器设备
16.VPN和NAT技术
17.IP多播(不考)
17.1 基本概念
- 多播
(multicast):一对多通信,从一个源点发送到多个终点
在网络上进行多播就叫做IP多播,互联网范围内的多播要依赖于路由器进行实现,能够运行多播协议的路由器称为多播路由器,多播是单播的扩展,多播路由器也支持普通的单播。
- 多播
IP地址:在IP多播数据报的目的地址需要写入多播组的标识符,多播组的标识符就是IP地址中的D类地址(多播地址),地址范围:224.0.0.0~239.255.255.255,每一个D类地址标志一个多播组
多播数据报
目的地址:使用D类的IP地址
协议字段=2,表示使用网际组管理协议IGMP
尽最大努力进行交付,不保证一定能够交付多播组内的所有的成员
对多播数据报不产生IGMP差错报文,在Ping多播地址后将永远不会收到回应。
17.2 在局域网上进行硬件多播
17.3 网际组管理协议IGMP和多播路由选择协议
网际组管理协议IGMP:使得多播路由器知道多播组成员信息(有无成员)
多播路由选择协议,使得多播路由器协同工作,把多播数据报用最小代价传递给多播组的所有成员
IGMP的作用是使得多播路由器知道多播组成员的信息,也就是及时通报知道本地局域网上是否有主机参加或者退出了某个多播组,IGMP不知道IP多播包含的成员数,也不知道这些成员都分布在哪些网络上
IGMP的工作流程
第一阶段:加入多播组,当某个主机加入多播组的时候,该主机向多播组的多播地址发送
IGMP报文,声明自己要成为该组的成员,本地的多播路由器收到IGMP报文之后,将组成员关系转发给互联网上的其他多播路由器第二阶段:本地多播路由器周期性地探询本地局域网上的主机,以便知道这些主机是否组的成员,只要对某个组有一个主机进行了响应,那么多播路由器就认为这个组是活跃的。但是如果一个组在经过几次的探询之后没有主机进行响应,则不再将该组的成员关系转发给其他的多播路由器。